#include "gpio_uart.h"

// 全局的接口指针
static GPIO_UART_Interface *uart_interface = NULL;

// 初始化 GPIO 模拟串口
void GPIO_UART_Init(GPIO_UART_Interface *interface)
{
    uart_interface = interface;

    if (uart_interface != NULL)
    {
        // 初始化 TX 和 RX 引脚
        uart_interface->init_tx();
        uart_interface->init_rx();
    }
}

// 模拟串口发送 1 个字节
void GPIO_UART_SendByte(uint8_t byte)
{
    if (uart_interface == NULL)
        return;

    // 起始位（低电平）
    uart_interface->set_tx_low();
    uart_interface->delay_us(BIT_DELAY_US);

    // 数据位（从 LSB 开始发送）
    for (int i = 0; i < 8; i++)
    {
        if (byte & 0x01) // 检查最低位
            uart_interface->set_tx_high();
        else
            uart_interface->set_tx_low();

        uart_interface->delay_us(BIT_DELAY_US); // 保持电平的时间
        byte >>= 1; // 移动到下一位
    }

    // 停止位（高电平）
    uart_interface->set_tx_high();
    uart_interface->delay_us(BIT_DELAY_US);
}

// 模拟串口发送字符串
void GPIO_UART_SendString(const char *str)
{
    if (uart_interface == NULL)
        return;

    while (*str)
    {
        GPIO_UART_SendByte((uint8_t)(*str)); // 逐字节发送
        str++;
    }
}

// 模拟串口接收 1 个字节
uint8_t GPIO_UART_ReceiveByte(void)
{
    if (uart_interface == NULL)
        return 0;

    uint8_t byte = 0;

    // 等待起始位（低电平）
    while (uart_interface->read_rx() == 1);

    // 延时到数据位中间采样（起始位持续 1 位时间）
    uart_interface->delay_us(BIT_DELAY_US / 2);

    // 读取 8 位数据（从 LSB 开始）
    for (int i = 0; i < 8; i++)
    {
        if (uart_interface->read_rx() == 1)
            byte |= (1 << i); // 设置相应位为 1
        uart_interface->delay_us(BIT_DELAY_US); // 等待下一个位
    }

    // 等待停止位（忽略停止位的校验）
    uart_interface->delay_us(BIT_DELAY_US);

    return byte; // 返回接收到的字节
}
